#ifndef __DBG_H__
#define __DBG_H__

#include "mmu.h"
#include "stdio.h"

// #include <execinfo.h>
// #include<stdlib.h>

#ifdef DEBUG
#define __DEBUG_BASIC printf("\033[1m\033[33m[%s]\033[32m%s:%d\033[0m ", __func__, __FILE__, __LINE__)
#define __DEBUG_INFO(message)  \
    ({                         \
        __DEBUG_BASIC;         \
        printf(#message "\n"); \
    })
#define __DEBUG_OUTPUT(...)  \
    ({                       \
        __DEBUG_BASIC;       \
        printf(__VA_ARGS__); \
    })
#define __DEBUG_FUNC_START printf("\033[1m\033[33m[%s] \033[34mstart\033[0m\n", __func__)
#define __DEBUG_FUNC_END printf("\033[1m\033[33m[%s] \033[34mend\033[0m\n", __func__)
#define __DEBUG_PTR_CONTENT(ptr, n)                      \
    ({                                                   \
        const int __dbg_len = 16;                        \
        __DEBUG_BASIC;                                   \
        printf("\n[ptr]%s:0x%x, n: %d\n", #ptr, ptr, n); \
        char* p = (char*)(ptr);                          \
        for (int i = 0; i < n; ++i, ++p) {               \
            if (i % __dbg_len == 0)                      \
                printf("%d: ", i / __dbg_len);           \
            printf("%x ", *p);                           \
            if (i % __dbg_len == __dbg_len - 1)          \
                printf("\n");                            \
        }                                                \
        if (n % __dbg_len != 0)                          \
            printf("\n");                                \
    })
#else
#define __DEBUG_BASIC
#define __DEBUG_INFO(message)
#define __DEBUG_OUTPUT(...)
#define __DEBUG_FUNC_START
#define __DEBUG_FUNC_END
#define __DEBUG_PTR_CONTENT(ptr, n)
#endif

// void
// print_backtrace() {
// #define MAX_STACK_SIZE 32
//     int size = MAX_STACK_SIZE;
//     void* array[MAX_STACK_SIZE];
//     //获取函数调用栈,并把地址存入array数组, 返回实际个数
//     int stack_num = backtrace(array, size);
//     //将调用地址转化为字符串,字符串会被malloc,但也会在stacktrace 分配的内存块下.
//     // 可见backtrace_symbols 这个函数需要很好的管理内存.
//     char** stacktrace = backtrace_symbols(array, stack_num);
//     for (int i = 0; i < stack_num; ++i) {
//         printf("%s\n", stacktrace[i]);
//     }
//     //释放函数分配的内存,这会连分条目字符串也一块释放，分条目字符串也在这块内存之下！
//     kfree(stacktrace);
// }

#endif